package com.zohnblog.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zohnblog.dao.IPBanModeMapper;
import com.zohnblog.model.domain.IPBanMode;
import com.zohnblog.service.IIPBanModeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class IPBanModerServiceImpl implements IIPBanModeService {
    @Autowired
    IPBanModeMapper ipBanModeMapper;
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 获取开启的IP封禁模式;
     * 先从redis中获取,若redis没有则从数据库获取;
     * 若数据库中返回的开启的IP封禁模式多于1个,则关闭所有mode;
     * 若数据库中返回的开启的IP封禁模式等于1个,则将此写到redis并返回
     * @return IPBanMode 开启的IP封禁模式;
     */
    @Override
    public IPBanMode getOpenMode(){
        IPBanMode ipBanMode = null;
        Object o = redisTemplate.opsForValue().get("ipBanMode");
        if(o!=null){
            ipBanMode = (IPBanMode) o;
        } else {
            List<IPBanMode> modeList = ipBanModeMapper.getOpenMode();
            if (modeList.size() > 1) {
                ipBanModeMapper.closeAllMode();
            } else if (modeList.size() == 1) {
                ipBanMode = modeList.get(0);
                redisTemplate.opsForValue().set("ipBanMode", ipBanMode);
            }
        }
        return ipBanMode;
    }

    /**
     * 获取所有P封禁模式;
     * @return List<IPBanMode> 所有IP封禁模式;
     */
    @Override
    public PageInfo<IPBanMode> getAllMode(int page, int count) {
        PageHelper.startPage(page, count);
        List<IPBanMode> ipBanModes = ipBanModeMapper.getAllMode();
        PageInfo<IPBanMode> pageInfo = new PageInfo<>(ipBanModes);
        return pageInfo;
    }

    /**
     * 创建一个IP封禁模式;
     * @param ipBanMode;
     * @return Integer;
     */
    @Override
    public Integer createMode(IPBanMode ipBanMode) {
        ipBanMode.setOpenBan(false);
        Integer result = ipBanModeMapper.createMode(ipBanMode);
        return result;
    }

    /**
     * 更新一个P封禁模式;
     * @param ipBanMode;
     * @return List<IPBanMode> 所有IP封禁模式;
     */
    @Override
    public Integer updateMode(IPBanMode ipBanMode) {
        Integer result = ipBanModeMapper.updateMode(ipBanMode);
        return result;
    }

    /**
     * 关闭一个开启的IPBanMode;
     * @return Integer 删除操作返回的数量;
     */
    public Integer closeMode(Integer id) {
        if (redisTemplate.hasKey("ipBanMode")) {
            redisTemplate.delete("ipBanMode");
        }
        return ipBanModeMapper.closeMode(id);
    }

    /**
     * 关闭所有开启的IPBanMode;
     * 判断redis是否存在此key,若有则删除;
     * @return Integer 删除操作返回的数量;
     */
    @Override
    public Integer closeAllMode() {
        if (redisTemplate.hasKey("ipBanMode")) {
            redisTemplate.delete("ipBanMode");
        }
        return ipBanModeMapper.closeAllMode();
    }
    /**
     * 删除一个IPBanMode;
     * 判断redis是否存在此key,若有则删除;
     * @return Integer 删除操作返回的数量;
     */
    public Integer deleteMode(Integer id) {
        if (ipBanModeMapper.isOpenMode(id)) {
            redisTemplate.delete("ipBanMode");
        }
        return ipBanModeMapper.deleteMode(id);
    }

    /**
     * 打开一个IPBanMode;
     * 先关掉所有IPBanMode,
     * 再通过id打开IPBanMode,
     * 将该IPBanMode写入redis;
     * @param id 需要打开的IPBanMode的id;
     * @return res 打开操作返回的数量;
     */
    @Override
    public Integer openMode(Integer id){
        ipBanModeMapper.closeAllMode();
        Integer res = ipBanModeMapper.openMode(id);
        IPBanMode ipBanMode = ipBanModeMapper.getModeById(id);
        redisTemplate.opsForValue().set("ipBanMode", ipBanMode);
        return res;
    }
}
